Here is an example of generating PDF in CodeIgniter 4 using TCPDF. PDFs are widely used for creating invoices, receipts, reports, and other documents. By reading this guide, you'll learn
how to integrate TCPDF in CodeIgniter 4 and incorporate it as a feature in your projects.
Table Of Content
1 Prerequisites
1.) PHP version of 8.2
2.) Composer
3.) Mysql
2 Introduction
This tutorial covers
generating PDF in CodeIgniter 4 using the TCPDF library. While CodeIgniter lacks a built-in package for PDFs, TCPDF is a popular choice, offering extensive documentation. This guide will show
how to integrate TCPDF in CodeIgniter 4 .
3 Create / Install a Codeigniter 4 Project
3.1 Install Codeigniter 4 Project
To get started, ensure that you have Composer installed on your computer.
Use the following command to install a new CodeIgniter project:
composer create-project codeigniter4/appstarter ci-4-pdf-app
Then, navigate to your project directory:
cd ci-4-pdf-app
Rename the env file to .env and set the development mode in the .env file also configure mysql:
# CI_ENVIRONMENT = production CI_ENVIRONMENT = development
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=ci4_pdf DB_USERNAME=root DB_PASSWORD=
4 Install the TCPDF Library
To install TCPDF in Codeigniter 4, we can directly use composer.
Run the following command.
composer require tecnickcom/tcpdf
Once it is finished, to use it we can directly call it using the use statement in
use TCPDF;
5 Create A Model and Migration
Set up a migration for the
Order table and a model to manage the data.
php spark make:model OrderModel
Edit
app/Models/OrderModel.php to configure fields for managing order data.
<?php namespace App\Models; use CodeIgniter\Model; class OrderModel extends Model { protected $table = 'orders'; protected $primaryKey = 'id'; protected $allowedFields = ['order_ref','order_invoice','customer_first_name','customer_last_name','customer_address','customer_company','amount','order_status','order_at']; }
Create a migration file for the
orders table:
php spark make:migration AddOrder
Edit the migration file to define the table structure:
<?php namespace App\Database\Migrations; use CodeIgniter\Database\Migration; class AddOrder extends Migration { public function up() { $this->forge->addField([ 'id' => [ 'type' => 'BIGINT', 'constraint' => 255, 'unsigned' => true, 'auto_increment' => true ], 'order_ref' => [ 'type' => 'VARCHAR', 'constraint' => '255', ], 'order_invoice' => [ 'type' => 'VARCHAR', 'constraint' => '255', ], 'customer_first_name' => [ 'type' => 'VARCHAR', 'constraint' => '255', ], 'customer_last_name' => [ 'type' => 'VARCHAR', 'constraint' => '255', ], 'customer_address' => [ 'type' => 'VARCHAR', 'constraint' => '255', ], 'customer_company' => [ 'type' => 'VARCHAR', 'constraint' => '255', ], 'amount' => [ 'type' => 'VARCHAR', 'constraint' => '255', ], 'order_status' => [ 'type' => 'VARCHAR', 'constraint' => '255', ], 'order_at' => [ 'type' => 'TIMESTAMP', 'null' => true ], 'updated_at' => [ 'type' => 'TIMESTAMP', 'null' => true ], ]); $this->forge->addPrimaryKey('id'); $this->forge->createTable('orders'); } public function down() { $this->forge->dropTable('orders'); } }
Set up a migration for the
Order Items table and a model to manage the data.
php spark make:model OrderitemModel
Edit
app/Models/OrderitemModel.php to configure fields for managing order data.
<?php namespace App\Models; use CodeIgniter\Model; class OrderitemModel extends Model { protected $table = 'orderitems'; protected $primaryKey = 'id'; protected $allowedFields = ['order_id','product_name','item_price','quantity']; }
Create a migration file for the
order items table:
php spark make:migration AddOrderItems
Edit the migration file to define the table structure:
<?php namespace App\Database\Migrations; use CodeIgniter\Database\Migration; class AddOrderItems extends Migration { public function up() { $this->forge->addField([ 'id' => [ 'type' => 'BIGINT', 'constraint' => 255, 'unsigned' => true, 'auto_increment' => true ], 'order_id' => [ 'type' => 'VARCHAR', 'constraint' => '255', ], 'product_name' => [ 'type' => 'VARCHAR', 'constraint' => '255', ], 'item_price' => [ 'type' => 'VARCHAR', 'constraint' => '255', ], 'quantity' => [ 'type' => 'VARCHAR', 'constraint' => '255', ], ]); $this->forge->addPrimaryKey('id'); $this->forge->createTable('orderitems'); } public function down() { $this->forge->dropTable('orderitems'); } }
Run the migration:
php spark migrate
6 Create New Controller (InvoiceController)
Generate a
InvoiceController to handle Generate PDF methods:
php spark make:controller InvoiceController
Add methods for generating PDF:
<?php namespace App\Controllers; use App\Controllers\BaseController; use CodeIgniter\HTTP\ResponseInterface; use App\Models\OrderModel; use App\Models\OrderitemModel; use TCPDF; class InvoiceController extends BaseController { public function __construct() { $this->ordermodel = new OrderModel(); $this->orderitemmodel = new OrderitemModel(); } public function index() { $ordermodel = new OrderModel(); $data = [ 'orders' => $this->ordermodel->findAll(), ]; return view('index',$data); } public function invoice($id) { $data = [ 'order' => $this->ordermodel->find($id), 'orderitems' => $this->orderitemmodel->where("order_id",$id)->findAll(), ]; $html = view('invoice',$data); $pdf = new TCPDF('L', PDF_UNIT, 'A5', true, 'UTF-8', false); $pdf->SetCreator(PDF_CREATOR); $pdf->SetAuthor('Get Sample Code'); $pdf->SetTitle('Invoice'); $pdf->SetSubject('Invoice'); $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); $pdf->addPage(); // output the HTML content $pdf->writeHTML($html, true, false, true, false, ''); //line ini penting $this->response->setContentType('application/pdf'); //Close and output PDF document $pdf->Output('invoice.pdf', 'I'); } } ?>
7 Create View Files
Create an
index.php file in
app/Views to display the Order data.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>DataTables with CodeIgniter 4</title> <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.0.1/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.datatables.net/1.11.4/css/dataTables.bootstrap5.min.css" rel="stylesheet"> <script src="https://code.jquery.com/jquery-3.5.1.js"></script> <script src="https://cdn.datatables.net/1.10.22/js/jquery.dataTables.min.js"></script> <script src="https://cdn.datatables.net/1.10.22/js/dataTables.bootstrap5.min.js"></script> </head> <body> <div class="container"> <h1>Order List</h1> <table id="orderTable" class="table table-bordered "> <thead> <tr> <th scope="col">Order Ref</th> <th scope="col" class="text-right">Amount</th> <th scope="col" class="text-right">Order Status</th> <th scope="col" class="text-right">Download Invoice</th> </tr> </thead> <tbody> <?php foreach($orders as $order) {?> <tr> <td><?php echo $order['order_ref'];?></td> <td><?php echo $order['amount'];?></td> <td><?php echo $order['order_status'];?></td> <td> <a target="_blank" title="Generate Invoice" href="invoicepdf/<?php echo $order['id'];?>"> <?php echo $order['order_invoice'];?> </a> </td> </tr> <?php }?> </tbody> </table> </div> <script> $(document).ready(function() { $('#orderTable').DataTable({}); }); </script> </body> </html>
Create an
invoice.php file in
app/Views to Generate Invoice PDF.
<html> <head> <title>Get Sample Code Codigniter 4 TCPDF Generation </head> <body> <div style="font-size:24px; color:'#dddddd' "><i>Invoice</i></div> <hr> <table style="line-height: 1.5;" border="0"> <tr> <td><b>Invoice:</b> #<?php echo $order["order_invoice"]; ?></td> <td style="text-align:right;"><b>Receiver:</b></td> </tr> <tr> <td><b>Date:</b> <?php echo date('Y-m-d',strtotime($order["order_at"])); ?></td> <td style="text-align:right;"><?php echo $order["customer_first_name"] . ' ' . $order["customer_last_name"]; ?></td> </tr> <tr> <td><b>Payment Due:</b><?php echo date('Y-m-d',strtotime($order["order_at"].' + 10 days')); ?></td> <td style="text-align:right;"><?php echo $order["customer_company"]; ?></td> </tr> <tr> <td></td> <td style="text-align:right;"><?php echo $order["customer_address"]; ?></td> </tr> </table> <hr> <div style="border-bottom:1px solid #000;"> <table style="line-height: 2;"> <tr style="font-weight: bold;border:1px solid #cccccc;background-color:#f2f2f2;"> <td style="border:1px solid #cccccc;width:200px;">Item Description</td> <td style = "text-align:right;border:1px solid #cccccc;width:85px">Price ($)</td> <td style = "text-align:right;border:1px solid #cccccc;width:75px;">Quantity</td> <td style = "text-align:right;border:1px solid #cccccc;">Subtotal ($)</td> </tr> <?php $total = 0; foreach($orderitems as $item) { $price = $item["item_price"] * $item["quantity"]; $total += $price; ?> <tr> <td style="border:1px solid #cccccc;"><?php echo $item["product_name"]; ?></td> <td style = "text-align:right; border:1px solid #cccccc;"><?php echo number_format($item["item_price"], 2); ?></td> <td style = "text-align:right; border:1px solid #cccccc;"><?php echo $item["quantity"]; ?></td> <td style = "text-align:right; border:1px solid #cccccc;"><?php echo number_format($price, 2); ?></td> </tr> <?php } ?> <tr style = "font-weight: bold;"> <td></td><td></td> <td style = "text-align:right;">Total ($)</td> <td style = "text-align:right;"><?php echo number_format($total, 2); ?></td> </tr> </table></div> </body> </html>
8 Define a Route
Configure routes in
app/Config/Routes.php: use CodeIgniter\Router\RouteCollection; $routes->get('/', 'Home::index'); $routes->get('/orders', 'InvoiceController::index'); $routes->get('/invoicepdf/(:any)', 'InvoiceController::invoice/$1');
9 Folder Structure
OrderModel.php
OrderitemModel.php
10 Run Web Server to Test the App
Start the server:
php spark serve
Visit the URL http://localhost:8080/index.php/orders
11 Conclusion
With this example, you now know
how to integrate TCPDF in CodeIgniter 4 for generating PDF files.
Reference URL
Tags